home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 4
/
Meeting Pearls Vol. IV (1996)(GTI - Schatztruhe)[!].iso
/
Pearls
/
dev
/
Oberon
/
OberonV4
/
system1
/
ExprSubstituter.Mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
1996-03-26
|
2KB
|
60 lines
Syntax10.Scn.Fnt
Syntax10i.Scn.Fnt
StampElems
Alloc
20 Apr 95
Syntax10b.Scn.Fnt
MODULE ExprSubstituter; (* ww
IMPORT
Texts, Oberon, Expressions, ExprViews, ExprIcons;
PROCEDURE Subst(VAR exp: Expressions.Expression; from, to: Expressions.Expression; s: Expressions.UnificationScope);
VAR l: Expressions.List; e: Expressions.Expression; r: Expressions.Rider;
BEGIN
e := exp; Expressions.Normalize(e, s);
IF Expressions.Equal(e, from) THEN exp := to
ELSE
Expressions.OpenRider(r, exp.successors);
WHILE ~r.eol DO
e := r.exp; Subst(e, from, to, s);
IF e # r.exp THEN Expressions.Change(r, e, r.attr) END;
Expressions.Forward(r)
END;
l := Expressions.ThisList(r);
IF l # exp.successors THEN exp := Expressions.CloneOf(exp, l) END
END
END Subst;
PROCEDURE ReadPar(VAR from, to: Expressions.Expression);
VAR beg, end, d, pos: LONGINT; ch: CHAR; eot: BOOLEAN; t: Texts.Text; r: Texts.Reader;
BEGIN
to := NIL;
t := Oberon.Par.text; pos := Oberon.Par.pos;
Texts.OpenReader(r, t, pos); Texts.Read(r, ch);
WHILE ~r.eot & (ch # "=") DO Texts.Read(r, ch) END;
IF ~r.eot THEN Texts.Read(r, ch) END;
WHILE ~r.eot & (ch # ">") DO
WHILE ~r.eot & (ch # "=") DO Texts.Read(r, ch) END;
IF ~r.eot THEN Texts.Read(r, ch) END
END;
IF ~r.eot THEN
beg := pos; end := Texts.Pos(r) - 2;
ExprIcons.defaultConverter.read(ExprIcons.defaultConverter, ExprIcons.LogError, t, beg, end, d, eot, from);
IF from # NIL THEN
beg := Texts.Pos(r); end := t.len;
ExprIcons.defaultConverter.read(ExprIcons.defaultConverter, ExprIcons.LogError, t, beg, end, d, eot, to)
END
END
END ReadPar;
PROCEDURE Substitute*;
VAR sel: ExprViews.Selection; from, to: Expressions.Expression; s: Expressions.UnificationScope;
BEGIN
ReadPar(from, to);
sel := ExprViews.LatestSelection();
IF (to # NIL) & (sel # NIL) & ~sel.promise THEN
s := Expressions.NewUnificationScope();
Expressions.Normalize(from, s); Expressions.Normalize(to, s);
Subst(sel.exp, from, to, s);
sel.notify(sel, sel)
END
END Substitute;
END ExprSubstituter.